/**
 * 设计思路：
 * 对于继承和多态和接口，首先，你要先明白这个题目的条件信息
 * 观察是否有很多重复的部分，例如，狗和猫这两个类中都有age和color属性
 * 这时需要定义一个Animal类，让猫和狗去继承这个Animal类
 *
 * 如果没有重复的成员变量，只有重复的成员方法，则可以定义一个Animal接口
 * 让猫和狗去实现这个接口
 *
 * 这是因为：接口中大多数抽象方法，成员变量都是static final类型的，有时候不满足土木需求
 * 父类中可以有抽象方法（abstract），也可以有普通的成员变量
 *
 * 后续的实现就牵扯很多，与权限修饰符等有关，不过可以自己摸索，但是都是我给你讲过的
 */

package ClassTest;
abstract class  Animal{
    private int age;
    private String color;
    public Animal(int age,String color){
        this.age = age;
        this.color = color;
    }
    public int getAge() {
        return age;
    }
    public String getColor() {
        return color;
    }
    public abstract void eat(String something);
}

class Dog extends Animal{
    public Dog(int age,String color){
        super(age,color);
    }
    @Override
    public void eat(String something) {
        System.out.println(getAge() + "岁的" + getColor() + "颜色的狗狗只能用最常见的枪在" + something + "猛吃");
    }
}
class Cat extends Animal{
    public Cat(int age,String color){
        super(age, color);
    }
    @Override
    public void eat(String something) {
       System.out.println(getAge() + "岁的" + getColor() + "颜色的猫咪看眼睛看着头吃" + something);
    }
}
class Person{
    private int age;
    private String name;

    public Person(int age, String name) {
        this.age = age;
        this.name = name;
    }

    public void keepPet(Animal animal, String something){
        //因为猫和狗的eat方法大致是相似的，所以在不同之处再用instanceof
            System.out.println("年龄为"+this.age+"岁的"+this.name+"养了一只"+animal.getColor()+"的"+animal.getAge()+"岁的"+
                    (animal instanceof Dog ? "狗" : "猫"));
            animal.eat(something);
      //如果猫和狗中存在名字不同的方法，那么就需要提前使用instanceof判断是猫是狗，再调用其特殊的方法
    }
}

public class Deno1 {
    public static void main(String[] args) {
        Dog dog = new Dog(5,"xiaocao");
        Cat cat = new Cat(4,"xiaohe");
        Person person = new Person(34,"laowang");
        person.keepPet(dog,"骨头");
        person.keepPet(cat,"猫条");
    }
}
